package cn.iocoder.yudao.module.crm.service.coursematerial;

import cn.iocoder.yudao.module.crm.controller.admin.course.vo.CourseMaterialPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.course.vo.CourseMaterialSaveReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.course.vo.CoursePageReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.course.CourseDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.coursepackage.CoursePackageDO;
import cn.iocoder.yudao.module.crm.dal.mysql.course.CourseMapper;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import cn.iocoder.yudao.module.crm.dal.dataobject.coursematerial.CourseMaterialDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.crm.dal.mysql.coursematerial.CourseMaterialMapper;

import java.util.Collections;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;

/**
 * 课程课件 Service 实现类
 *
 * @author 管理员
 */
@Service
@Validated
public class CourseMaterialServiceImpl implements CourseMaterialService {

    @Resource
    private CourseMaterialMapper courseMaterialMapper;
    @Resource
    private CourseMapper courseMapper;

    @Override
    public Long createCourseMaterial(CourseMaterialSaveReqVO createReqVO) {
        // 插入
        CourseMaterialDO courseMaterial = BeanUtils.toBean(createReqVO, CourseMaterialDO.class);
        courseMaterialMapper.insert(courseMaterial);
        // 返回
        return courseMaterial.getId();
    }

    @Override
    public void updateCourseMaterial(CourseMaterialSaveReqVO updateReqVO) {
        // 校验存在
        validateCourseMaterialExists(updateReqVO.getId());
        // 更新
        CourseMaterialDO updateObj = BeanUtils.toBean(updateReqVO, CourseMaterialDO.class);
        courseMaterialMapper.updateById(updateObj);
    }

    @Override
    public void deleteCourseMaterial(Long id) {
        // 校验存在
        validateCourseMaterialExists(id);
        // 删除
        courseMaterialMapper.deleteById(id);
    }

    private void validateCourseMaterialExists(Long id) {
        if (courseMaterialMapper.selectById(id) == null) {
            throw exception(COURSE_MATERIAL_NOT_EXISTS);
        }
    }

    @Override
    public CourseMaterialDO getCourseMaterial(Long id) {
        return courseMaterialMapper.selectById(id);
    }

    @Override
    public PageResult<CourseMaterialDO> getCourseMaterialPage(CourseMaterialPageReqVO pageReqVO) {
        // 查询课程下课件
        if (pageReqVO.getCourseId() != null && pageReqVO.getCourseId() > 0) {
            if (!setCourseIdsFromPackage(pageReqVO, pageReqVO.getCourseId(), true)) {
                return new PageResult<>(Collections.emptyList(), 0L);
            }
        }
        // 查询课程没有的课件
        if (pageReqVO.getNotInCourseId() != null && pageReqVO.getNotInCourseId() > 0) {
            setCourseIdsFromPackage(pageReqVO, pageReqVO.getNotInCourseId(), false);
        }
        return courseMaterialMapper.selectPage(pageReqVO);
    }

    /**
     * 从课程套餐中提取课程ID，并设置到 pageReqVO 中
     *
     * @param pageReqVO       请求参数对象
     * @param courseId       套餐ID
     * @param isInCourseMaterialIds   是否是设置 isInCourseMaterialIds
     * @return 如果成功设置课程ID返回 true，否则返回 false
     */
    private boolean setCourseIdsFromPackage(CourseMaterialPageReqVO pageReqVO, Long courseId, boolean isInCourseMaterialIds) {
        CourseDO courseDO = courseMapper.selectById(courseId);
        if (courseDO == null || courseDO.getCourseMaterialIds() == null || courseDO.getCourseMaterialIds().isEmpty()) {
            return false;
        }
        if (isInCourseMaterialIds) {
            pageReqVO.setInCourseMaterialIds(courseDO.getCourseMaterialIds());
        } else {
            pageReqVO.setNotInCourseMaterialIds(courseDO.getCourseMaterialIds());
        }
        return true;
    }

}